package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.dao.VendedorDAO;
import com.divemotor.ventarepuestosinternet.model.Departamento;
import com.divemotor.ventarepuestosinternet.model.Distrito;
import com.divemotor.ventarepuestosinternet.model.Provincia;
import com.divemotor.ventarepuestosinternet.model.Sucursal;
import com.divemotor.ventarepuestosinternet.model.Supervisor;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.model.Vendedor;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;

@SuppressWarnings("unchecked")
@Repository(value="vendedorDAO")
public class VendedorDAOImpl implements VendedorDAO , Serializable{

	private static final long serialVersionUID = 7677998440080097257L;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	@Override
	public Vendedor obtnerPorUsuario(Vendedor vendedor) {
		 Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class,"vendedor");
		 criteria.createAlias("vendedor.usuario","usu");
		 criteria.add(Restrictions.eq("usu.usuario", vendedor.getUsuario().getUsuario()));
		 return (Vendedor)criteria.uniqueResult();
	}

	@Override
	public List<Vendedor> listarVendedores(Vendedor vendedor) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class);
		criteria.createAlias("usuario","usuario");
		criteria.add(Restrictions.eq("usuario.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
		criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		return criteria.list();
	}

	@Override
	public void insertar(Vendedor vendedor) {
		sessionFactory.getCurrentSession().persist(vendedor);
		sessionFactory.getCurrentSession().flush();
	}

	@Override
	public void actualizar(Vendedor vendedor) {
	   sessionFactory.getCurrentSession().merge(vendedor);
	}

	@Override
	public void eliminar(Vendedor vendedor) {
		sessionFactory.getCurrentSession().merge(vendedor);
	}

	@Override
	public List<Vendedor> listar() {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class);
		criteria.createAlias("usuario","usuario");
		criteria.add(Restrictions.eq("usuario.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
		criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		return criteria.list(); 
	}

	@Override
	public void eliminarPorUsuario(Vendedor vendedor) {
		sessionFactory.getCurrentSession().merge(vendedor);
	}

	@Override
	public Vendedor obtenerPorIdUsuario(Usuario usuario) {
		Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Vendedor.class);
		criteria.add(Restrictions.eq("usuario", usuario));
		criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		return (Vendedor) criteria.uniqueResult();
	}

	@Override
	public List<Vendedor> buscar(Vendedor vendedor) {
		Criteria  criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class,"vendedor");
		criteria.createAlias("vendedor.usuario", "usu");
		criteria.add(Restrictions.eq("usu.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
		if (!vendedor.getUsuario().getNombres().equals("")) {
			criteria.add(Restrictions.like("usu.nombres", "%" + vendedor.getUsuario().getNombres() + "%").ignoreCase());
		}
		
		if (!vendedor.getUsuario().getApellidos().equals("")) {
			criteria.add(Restrictions.like("usu.apellidos", "%" + vendedor.getUsuario().getApellidos() + "%").ignoreCase());
		}

		if (!vendedor.getUsuario().getUsuario().equals("")) {
			criteria.add(Restrictions.like("usu.usuario", "%" + vendedor.getUsuario().getUsuario() + "%").ignoreCase());
		}
		
		if (!vendedor.getEstado().equals(Constantes.NO_SELECCIONADO_ETIQUETA)) {
			criteria.add(Restrictions.eq("vendedor.estado", vendedor.getEstado()));
		
		}
		
		if(!vendedor.getSucursal().getIdSucursal().equals(Constantes.NO_SELECCIONADO)){
			criteria.add(Restrictions.eq("vendedor.sucursal", vendedor.getSucursal()));
		}
		
		criteria.add(Restrictions.not(Restrictions.eq("vendedor.estado", Constantes.ESTADO_ELIMINADO)));
		return criteria.list();
	}

	@Override
	public List<Departamento> obtenerDepartamentosPorVendedor() {
		return null;
	}

	@Override
	public List<Provincia> obtenerProvinciasPorVendedor(Integer idDepartamento) {
		return null;
	}

	@Override
	public List<Distrito> obtenerDistritosPorVendedor(Integer idprovincia) {
		return null;
	}

	@Override
	public List<Sucursal> obtenerListaSucursales(
			Usuario obtenerUsuarioAutenticado) {
		return null;
	}

	@Override
	public List<Vendedor> listarVendedoresPorSupervisor(Supervisor supervisor) {
		if (supervisor.getListaSucursal() != null && supervisor.getListaSucursal().size() > 0) {
			
			List<Integer> listaIdsSucursales = new ArrayList<Integer>();
			for (Sucursal sucursal : supervisor.getListaSucursal()) {
				listaIdsSucursales.add(sucursal.getIdSucursal());
			}
			
			Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class, "vendedor")
					.createAlias("vendedor.sucursal", "sucursal")
					.setProjection(Projections.distinct(Projections.property("vendedor.idVendedor")))
					.add(Restrictions.in("sucursal.idSucursal", listaIdsSucursales))
					.add(Restrictions.eq("vendedor.estado", Constantes.ESTADO_ACTIVO));
			
			List<Integer> listaIdsVendedores = criteria.list();
			
			return listarVendedoresPorIds(listaIdsVendedores);
		} else {
			return new ArrayList<Vendedor>();
		}
	}

	@Override
	public List<Vendedor> listarVendedoresPorIds(List<Integer> listaIdsVendedores) {
		if (listaIdsVendedores != null && listaIdsVendedores.size() > 0) {
			Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class, "vendedor")
					.add(Restrictions.in("vendedor.idVendedor", listaIdsVendedores));
			return criteria.list();
		} else {
			return new ArrayList<Vendedor>();
		}
	}

}
